home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Otherware
/
Otherware_1_SB_Development.iso
/
mac
/
hypercar
/
xfcn
/
spttool.cpt
/
Support Tools eXternals 1.2.5
/
card_33339.txt
< prev
next >
Wrap
Text File
|
1990-11-13
|
11KB
|
312 lines
-- card: 33339 from stack: in.5
-- bmap block id: 8933
-- flags: 0000
-- background id: 3858
-- name: FileCreator
----- HyperTalk script -----
on HideObjects
hide cd btn "Try It!"
end HideObjects
on ShowObjects
show cd btn "Try It!"
end ShowObjects
-- part 1 (button)
-- low flags: 00
-- high flags: A002
-- rect: left=82 top=185 right=219 bottom=175
-- title width / last selected line: 0
-- icon id / first selected line: 0 / 0
-- text alignment: 1
-- font id: 0
-- text size: 12
-- style flags: 8192
-- line height: 16
-- part name: Try it!
----- HyperTalk script -----
on mouseUp
global errGlobal
put FilePath("", "Choose a file please.") into fileName
if fileName = empty then exit mouseUp
put FileCreator(fileName, "nodialog:errGlobal") into fCreator
if errGlobal Γëá empty then
answer "Error: ΓÇ£" & errGlobal & "ΓÇ¥"
put empty into errGlobal
else
answer "The creator string for ΓÇ£" & fileName & "ΓÇ¥ is ΓÇ£" & fCreator & "ΓÇ¥"
end if
end mouseUp
-- part contents for background part 38
----- text -----
15/50
-- part contents for background part 20
----- text -----
FileCreator - An XFCN to return a file's creator
FileCreator(pathname, «"noDialog:"errorGlobal»)
This XFCN returns the four character creator for the file specified in pathname.
-- part contents for background part 42
----- text -----
{ FileCreator(pathname «,"nodialog":errGlobal») }
{ XFCN to return the creator for the file specified by }
{ the path given in the first parameter. }
{}
{ Written by: Anup Murarka Eric Carlson }
{ ALINK: SKEPTIC ALINK: cyNic }
{ CIS: 76004,3356}
{}
{ We are part of the Support Tools Development Group, }
{ Apple Computer, Inc. }
{}
{ please DO NOT contack Mac DTS for support of this code! }
{}
{ please DO contact the authors for support of this code! }
{}
{ Send comments, bug reports, requests to any of the above }
{ E-mail addresses or to:}
{}
{ (one of us) }
{ Apple Computer, Inc. }
{ 900 E. Hamilton, Ave. }
{ Campbell, CA 95008 }
{ M/S 72-L }
{}
{ Copyright: © 1989, 1990 by Apple Computer, Inc., all rights reserved. }
{}
{ written by : Anup Murarka }
{ AppleLink : Skeptic }
{ modification history }
{ Date Initials Comments }
{ ---- ------ ------------------------------------------------------ }
{ 8/16/89 akm first written }
{ 5/22/90 ec removed upper case converion for A/UX compatibility. }
{ Changed version to 1.1 }
{}
unit FileCreator;
interface
uses
HyperXCmd;
procedure MAIN (paramPtr: XCmdPtr);
implementation
procedure FileCreator (paramPtr: XCmdPtr);
FORWARD;
procedure MAIN (paramPtr: XCmdPtr);
begin
FileCreator(paramPtr);
end;
procedure reportToUser (paramPtr: XCmdPtr; msgStr: str255);
{}
{ report something back to the user. }
{ the last parameter (optional) to an external may contain }
{ "noDialog" or "noDialog:GlobalName". GlobalName is the name }
{ of a HyperTalk global variable into which error messages will be }
{ placed. we've decided to use this approach to avoid confusing }
{ an error message with a valid result being returned from an XFCN. }
{}
var
tempStr: str255;
begin
{check the last param to see if the user requested that}
{ we suppress the error dialog }
ZeroToPas(paramPtr, paramPtr^.params[paramPtr^.paramCount]^, tempStr);
UprString(tempStr, true);
if pos('NODIALOG', tempStr) = 0 then
{ no special error handling specified, throw up a dialog and return the error message }
begin
SendCardMessage(paramPtr, concat('answer "', msgStr, '"'));
paramPtr^.returnValue := PasToZero(paramPtr, msgStr);
end
else if (pos(':', tempStr) > 0) then
{ requested global AND noDialog so we fill in the global and return empty }
begin
tempStr := copy(tempStr, pos(':', tempStr) + 1, length(tempStr));
{ get the name of the HC global to fill }
SetGlobal(paramPtr, tempStr, PasToZero(paramPtr, msgStr));
{ and fill it }
paramPtr^.returnValue := PasToZero(paramPtr, ''); { return empty }
end
else
{ requested noDialog only so we return the error condition as the result }
paramPtr^.returnValue := PasToZero(paramPtr, msgStr);
end; { procedure }
function AskedForHelp (paramPtr: XCmdPtr; syntaxMsg: Str255; copyrightMsg: Str255): boolean;
{ check to see if the user sent a '?' or a '!' as }
{ the only parameter. if so we will respond with }
{ the calling syntax or the copyright/version info }
{ for this external }
{}
var
firstStr: str255;
begin
askedForHelp := false;
if paramPtr^.paramCount = 1 then
begin
ZeroToPas(paramPtr, paramPtr^.params[1]^, firstStr);
{ what is the first param? }
if firstStr = '?' then
begin
reportToUser(paramPtr, syntaxMsg);
askedForHelp := true
end { asked for help }
else if firstStr = '!' then
begin
reportToUser(paramPtr, copyRightMsg);
askedForHelp := true
end; { asked for copyright info }
end; { one parameter passed }
end; { function }
function BitTest (AddressToCheck: ptr; TotalBits: integer; BitToTest: longint): boolean;
{ function that allows caller to use std. 68000 bit notation instead of the Toolbox's reversed notation}
{ example: bit 0 (the least significant bit) in a byte is bit 7 in the Toolbox's notation}
begin
BitTest := BitTst(AddressToCheck, TotalBits - 1 - BitToTest);
end;
function NumberToString (paramPtr: XCmdPtr; num: LONGINT): Str255;
{ use the toolbox call rather than HC's }
var
tempStr: str255;
begin
NumToString(num, tempStr);
NumberToString := tempStr;
end;
procedure reportResError (paramPtr: XCmdPtr; errorNum: integer);
var
errMsg, tempName: str255;
begin
case errorNum of { what caused the problem? }
-0:
errMsg := 'no error.';
-36:
errMsg := 'I/O Error.';
-37:
errMsg := 'bad file name or volume name.';
-38:
errMsg := 'file not open.';
-39:
errMsg := 'that file has no resource fork.';
-42:
errMsg := 'too many files open.';
-43:
errMsg := 'file not found.';
-45, -54, -61:
errMsg := 'file locked.';
-47, -49:
errMsg := 'file is busy.';
-53:
errMsg := 'that volume is not on line.';
-108:
errMsg := 'not enough room in heap zone.';
-120:
errMsg := 'directory not found.';
-121:
errMsg := 'too many working directories open.';
-127:
errMsg := 'internal file system error.';
-192:
errMsg := 'resource not found.';
-193:
errMsg := 'file not found.';
otherwise
errMsg := concat('unexpected error #', NumberToString(paramPtr, errorNum));
end; { case }
errMsg := concat('Sorry, ', errMsg);
reportToUser(paramPtr, errMsg);
{ return the error message }
end; { function }
function getParams (paramPtr: XCmdPtr; var PathToFile: str255): boolean;
{ function to get the parameters and validate them. Returns boolean}
{ instructing the main procedure to continue if the parameters passed}
{ are valid. Also returns syntax messages if requested by the user.}
var
numParams: integer;
syntaxStr, copyrightStr: str255;
begin
getParams := true; {Initially, assume the parameters are valid.}
syntaxStr := 'FileCreator(pathname «,"nodialog":errGlobal»)';
copyrightStr := '© 1989,1990 Apple Computer, Inc., v.1.1, by Anup Murarka';
{check that we have the proper number of parameters}
numParams := paramPtr^.paramCount;
if (numParams < 1) or (numParams > 2) then
begin
getParams := false;
reportToUser(paramPtr, syntaxStr);
exit(getParams);
end;
if AskedForHelp(paramPtr, syntaxStr, copyrightStr) then
begin
getParams := false;
exit(getParams);
end;
{ convert HyperCard's zero terminated string to a Pascal string}
ZeroToPas(paramPtr, paramPtr^.Params[1]^, PathToFile);
end; {GetParams}
procedure FileCreator (paramPtr: XCmdPtr);
var
getParamsOK: boolean;
FileName: str255;
paramBlock: CInfoPBRec;
errorCode: OSerr;
charIndex: integer;
begin { FileCreator}
{ fetch and validate the passed parameters}
getParamsOK := getParams(paramPtr, FileName);
if not (getParamsOK) then
exit(FileCreator);
{ Initialize the parameter block. Since we have the full pathname,}
{ no other field is really needed.}
zeroBytes(paramPtr, @paramBlock, sizeOf(paramBlock));
paramBlock.ioNamePtr := @FileName;
errorCode := PBGetCatInfo(@paramBlock, FALSE);
if errorCode <> noErr then
begin
reportResError(paramPtr, errorCode);
exit(FileCreator)
end;
{ Make sure it is a file}
if BitTest(@paramBlock.ioFlAttrib, 8, 4) then
begin
reportToUser(paramPtr, 'Sorry, directories do not have creators.');
exit(FileCreator);
end;
{ Now set the return value. Use FileName as a temp variable}
FileName := '1234';
for charIndex := 1 to 4 do
FileName[charIndex] := paramBlock.ioFlFndrInfo.fdCreator[charIndex];
paramPtr^.returnValue := PasToZero(paramPtr, FileName);
end;
end.